package com.gxuwz.dbOper;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.PropertyResourceBundle;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

/**
 * 
 * @author Administrator
 * 
 */
public class DBconfig {
	/**
	 * 数据库访问URL
	 */
	private static String url;

	/**
	 * 数据库驱动
	 */
	private static String driver;

	/**
	 * 数据库访问用户名
	 */
	private static String username;

	/**
	 * 数据库访问口令
	 */
	private static String password;

	/**
	 * 访问类型
	 */
	private static String type;

	/**
	 * 数据源名称
	 */
	private static String datasource;

	/**
	 * 配置文件名称
	 */
	private final static String fileName = "database";

	private static ThreadLocal connection = new ThreadLocal();

	static {
		config();
	}

	private static void config() {
		// 读取系统配置
		PropertyResourceBundle resourceBundle = (PropertyResourceBundle) PropertyResourceBundle
				.getBundle(fileName);
		// 将系统设置赋值给类变量
		Enumeration enu = resourceBundle.getKeys();
		while (enu.hasMoreElements()) {
			String propertyName = enu.nextElement().toString();
			if (propertyName.equals("database.url"))
				url = resourceBundle.getString("database.url");
			if (propertyName.equals("database.driver"))
				driver = resourceBundle.getString("database.driver");
			if (propertyName.equals("database.username"))
				username = resourceBundle.getString("database.username");
			if (propertyName.equals("database.password"))
				password = resourceBundle.getString("database.password");
			if (propertyName.equals("database.type"))
				type = resourceBundle.getString("database.type");
			if (propertyName.equals("database.datasource"))
				datasource = resourceBundle.getString("database.datasource");
		}

	}

	/**
	 * 取得数据库连接
	 * 
	 * @return
	 * @throws SQLException
	 */
	// public synchronized static java.sql.Connection getConnection()
	// throws SQLException {
	// Connection con = (Connection) connection.get();
	// if (con != null && !con.isClosed()) {
	// return con;
	// }
	// if ("pooled".equalsIgnoreCase(type)) {
	// // 从JNDI中取得数据源
	// try {
	// // 此处对于不同的应用服务器，对env传入不同
	// Hashtable env = new Hashtable();
	// // 此处对于不同的应用服务器，对env传入不同
	// Context ctx = new InitialContext(env); // 从命名系统中获取 DataSource
	// // 工厂对象
	// DataSource dataSource = (DataSource) ctx.lookup(datasource);
	// con = dataSource.getConnection();
	// connection.set(con);
	// return con;
	// } catch (NamingException e) {
	// e.printStackTrace();
	// }
	// } else {
	// // 直接使用JDBC驱动连接
	// try {
	// Class providerClass = Class.forName(driver);
	// con = DriverManager.getConnection(url, username, password);
	// con.setAutoCommit(false);//默认是true（自动提交事务）。
	// connection.set(con);
	// return con;
	//
	// } catch (ClassNotFoundException e) {
	// e.printStackTrace();
	// }
	// }
	// return null;
	// }

	/**
	 * 取得数据库连接方法2，由于多人访问的时候并发不好，故直接是每个人都给你个连接
	 * 
	 * @return 数据库连接
	 * @throws SQLException
	 */
	public synchronized static java.sql.Connection getConnection()
			throws SQLException {
		Connection con = null;
		// 直接使用JDBC驱动连接
		try {
			Class providerClass = Class.forName(driver);
			con = DriverManager.getConnection(url, username, password);
			con.setAutoCommit(false);// 默认是true（自动提交事务）。
			
			return con;

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void commit(Connection con) {
		// Connection con = (Connection) connection.get();
		// System.out.println("提交事务的时候："+con);
		try {
			if (null != con) {
				con.commit();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public static void rollback(Connection con) {
		// Connection con = (Connection) connection.get();
		try {
			if (null != con) {
				con.rollback();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public synchronized static void releaseConnection(Connection connection) {

		try {
			if (connection != null && !connection.isClosed())
				connection.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		connection = null;
	}

	/**
	 * @category 数据库资源关闭函数
	 * @param ct
	 *            Connection类的对象
	 * @param sm
	 *            Statement类的对象
	 * @param rs
	 *            ResultSet类的对象
	 * @return 数据库资源关闭成功返回true，否则返回false
	 */
	public static boolean close_db(Connection ct, Statement sm, ResultSet rs) {
		boolean b = false;
		try {
			if (rs != null) {
				rs.close();
				rs = null;
			}
			if (sm != null) {
				sm.close();
				sm = null;
			}
			if (ct != null) {
				ct.close();
				ct = null;
			}
			if (rs == null && sm == null && ct == null) {
				b = true;
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return b;
	}

	/**
	 * @category 数据库资源关闭函数
	 * @param ct
	 *            Connection类的对象
	 * @param ps
	 *            PreparedStatement类的对象
	 * @param rs
	 *            ResultSet类的对象
	 * @return 数据库资源关闭成功返回true，否则返回false
	 */
	public static boolean close_db(Connection ct, PreparedStatement ps,
			ResultSet rs) {
		boolean b = false;
		try {
			if (rs != null) {
				rs.close();
				rs = null;
			}
			if (ps != null) {
				ps.close();
				ps = null;
			}
			if (ct != null) {
				ct.close();
				ct = null;
			}
			if (rs == null && ps == null && ct == null) {
				b = true;
				System.out.println("数据库资源已被关闭！");
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return b;
	}

	/**
	 * @category 数据库资源关闭函数
	 * @param ct
	 *            Connection类的对象
	 * @param ps
	 *            PreparedStatement类的对象
	 * @return 数据库资源关闭成功返回true，否则返回false
	 */
	public static boolean close_db(Connection ct, PreparedStatement ps) {
		boolean b = false;
		try {

			if (ps != null) {
				ps.close();
				ps = null;
			}
			if (ct != null) {
				ct.close();
				ct = null;
			}

			if (ps == null && ct == null) {
				b = true;
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return b;
	}

	public static void main(String[] args) {

//		try {
//			DBconfig.getConnection();
//		} catch (SQLException e) {
//			e.printStackTrace();
//		}
		
		try {
			Connection con1 = getConnection();
			Connection con2 = getConnection();
			
			System.out.println(con1);
			System.out.println(con2);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
